{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线程类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 线程函数类型：使用`std::function<void()>`定义无参数无返回值的线程函数类型\n",
    "- 线程构造函数：需要接收线程函数对象作为参数，并在成员变量中存储\n",
    "- 线程启动：通过`std::thread`创建线程对象并执行线程函数，需要设置分离线程(`detach`)\n",
    "- 关键实现：\n",
    "  - 线程分离：必须调用`t.detach()`将线程设置为分离状态，避免主线程结束后线程资源无法回收\n",
    "  - 函数绑定：使用`std::bind`将线程池成员函数绑定为线程函数，并传递`this`指针\n",
    "  - 生命周期管理：线程对象析构不影响线程函数的执行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线程池类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 核心组件：\n",
    "  - 线程列表：`std::vector<Thread*>`存储线程对象指针\n",
    "  - 任务队列：`std::queue<std::shared_ptr<Task>>`存储待处理任务\n",
    "  - 任务计数器：`std::atomic_int`记录任务数量\n",
    "- 工作模式：\n",
    "  - 固定模式(MODE_FIXED)：线程数量固定不变\n",
    "  - 缓存模式(MODE_CACHED)：线程数量可动态增长\n",
    "- 关键方法：\n",
    "  - `start()`：初始化并启动指定数量的线程\n",
    "  - `submitTask()`：向线程池提交任务\n",
    "  - `threadFunc()`：线程执行函数，从任务队列消费任务"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 构建项目"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 调试技巧：\n",
    "  - 线程ID打印：使用`std::this_thread::get_id()`验证不同线程的执行\n",
    "  - 主线程等待：通过`std::this_thread::sleep_for`让主线程等待子线程执行\n",
    "  - 分离线程验证：观察主线程结束后子线程能否继续执行\n",
    "- 常见问题：\n",
    "  - 无输出问题：主线程结束太快导致子线程未执行，需添加等待\n",
    "  - 线程数量验证：通过打印不同线程ID确认实际创建的线程数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 应用案例"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池使用示例\n",
    "\n",
    "- 基本用法：\n",
    "  - 创建线程池对象：`ThreadPool pool;`\n",
    "  - 设置工作模式：`pool.setMode(PoolMode::MODE_FIXED);`\n",
    "  - 启动线程池：`pool.start(4); // 启动4个线程`\n",
    "  - 提交任务：`pool.submitTask(task);`\n",
    "- 验证方法：\n",
    "  - 打印线程ID确认多线程执行\n",
    "  - 观察任务执行顺序验证异步处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题解析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 关键问题：\n",
    "  - 资源回收：非分离线程需要主线程`join`才能回收资源\n",
    "  - 生命周期：线程对象析构不应影响线程函数执行\n",
    "  - 跨平台行为：Windows和Linux下线程行为差异\n",
    "- 解决方案：\n",
    "  - 必须调用`detach()`分离线程\n",
    "  - 使用智能指针管理线程对象生命周期\n",
    "  - 添加适当的同步机制保证线程安全"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 继续之前的线程池项目"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 核心机制：\n",
    "  - 生产者-消费者模型：`submitTask`生产任务，`threadFunc`消费任务\n",
    "  - 线程安全：使用互斥锁和条件变量保护任务队列\n",
    "  - 流量控制：通过`taskQueMaxThreshHold`限制队列大小\n",
    "- 性能考量：\n",
    "  - 避免频繁创建销毁线程\n",
    "  - 合理设置线程数量和任务队列大小\n",
    "  - 减少锁竞争提高吞吐量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 课程总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 关键收获：\n",
    "  - 掌握了线程池的基本架构和实现原理\n",
    "  - 理解了线程生命周期管理和资源回收机制\n",
    "  - 学会了多线程调试和验证方法\n",
    "- 后续重点：\n",
    "  - 任务队列的线程安全实现\n",
    "  - 条件变量的正确使用\n",
    "  - 性能优化和异常处理"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
